package com.rickpan.repository;

import com.rickpan.entity.Favorite;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;

/**
 * 收藏文件Repository
 * 
 * @author RickPan Team
 * @since 2024-01-06
 */
@Repository
public interface FavoriteRepository extends JpaRepository<Favorite, Long> {

    /**
     * 根据用户ID和文件ID查找收藏记录
     */
    Optional<Favorite> findByUserIdAndFileId(Long userId, Long fileId);

    /**
     * 检查用户是否已收藏指定文件
     */
    boolean existsByUserIdAndFileId(Long userId, Long fileId);

    /**
     * 根据用户ID查找收藏列表
     */
    Page<Favorite> findByUserId(Long userId, Pageable pageable);

    /**
     * 根据用户ID查找所有收藏记录（不分页）
     */
    List<Favorite> findAllByUserId(Long userId);

    /**
     * 根据用户ID和分类查找收藏列表
     */
    Page<Favorite> findByUserIdAndCategory(Long userId, String category, Pageable pageable);

    /**
     * 根据用户ID查找最近收藏的文件
     */
    @Query("SELECT f FROM Favorite f WHERE f.userId = :userId ORDER BY f.createdAt DESC")
    List<Favorite> findRecentFavoritesByUserId(@Param("userId") Long userId, Pageable pageable);

    /**
     * 根据用户ID统计收藏数量
     */
    long countByUserId(Long userId);

    /**
     * 根据用户ID和分类统计收藏数量
     */
    long countByUserIdAndCategory(Long userId, String category);

    /**
     * 获取用户的分类统计
     */
    @Query("SELECT f.category as category, COUNT(f) as count FROM Favorite f WHERE f.userId = :userId GROUP BY f.category")
    List<CategoryCount> getCategoryStatsByUserId(@Param("userId") Long userId);

    /**
     * 根据用户ID删除收藏记录
     */
    void deleteByUserIdAndFileId(Long userId, Long fileId);

    /**
     * 批量删除收藏记录
     */
    void deleteByUserIdAndFileIdIn(Long userId, List<Long> fileIds);

    /**
     * 搜索收藏文件（根据备注内容、分类）
     */
    @Query("SELECT f FROM Favorite f WHERE f.userId = :userId AND " +
           "(f.notes LIKE %:keyword% OR f.category LIKE %:keyword%)")
    Page<Favorite> searchFavorites(@Param("userId") Long userId,
                                  @Param("keyword") String keyword,
                                  Pageable pageable);

    /**
     * 根据时间范围查找收藏记录
     */
    @Query("SELECT f FROM Favorite f WHERE f.userId = :userId AND " +
           "f.createdAt BETWEEN :startTime AND :endTime ORDER BY f.createdAt DESC")
    List<Favorite> findByUserIdAndCreatedAtBetween(@Param("userId") Long userId,
                                                   @Param("startTime") LocalDateTime startTime,
                                                   @Param("endTime") LocalDateTime endTime);

    /**
     * 分类统计接口
     */
    interface CategoryCount {
        String getCategory();
        Long getCount();
    }
}
